﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Finisar.SQLite;
using Microsoft.Office.Interop;
using Excel = Microsoft.Office.Interop.Excel;
using System.Collections;

namespace LP1415
{
    /// <summary>
    /// Abre ficheiro selecionado, cria listas, e passa as litas para a DB.
    /// </summary>    

    public partial class abrirCriarDB : Form
    {
        /// <summary>
        /// cria as listas de cada tabela</summary>
        ArrayList ano = new ArrayList();
        ArrayList ipc = new ArrayList();
        ArrayList txI = new ArrayList();
        ArrayList renMin = new ArrayList();
        ArrayList renMax = new ArrayList();
        ArrayList pib = new ArrayList();
        ArrayList renNac = new ArrayList();
        ArrayList renDisp = new ArrayList();
        ArrayList renPerCap = new ArrayList();
        ArrayList evoRenuMin = new ArrayList();
        ArrayList evoRenuMax = new ArrayList();
       
        /// <summary>
        /// Abre ficheiro selecionado, cria listas, e passa as litas para a DB.
        /// </summary> 
        public abrirCriarDB()
        {
            // TODO: Add Constructor Logic here.

            InitializeComponent();
            botaoSeguinte.Hide();
        }

        /// <summary>
        /// botao que cria a DB, abre o ficheiro xls e guarda cada tabela em sua lista para depois 
        /// as passar para a DB</summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {

            Excel.Application xlApp;
            Excel.Workbook xlWorkBook;
            Excel.Worksheet xlWorkSheet;
            Excel.Range range;


            int rCnt = 0;
            int cCnt = 0;
           
            //adiciona o nome das listas na posiçao 0
            evoRenuMin.Add("evolução das remunerações minimas");
            evoRenuMax.Add("evolução das remunerações Maximas");

            xlApp = new Excel.Application();
            xlWorkBook = xlApp.Workbooks.Open(this.pathText.Text, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            range = xlWorkSheet.UsedRange;
          
            //coloca cada coluna do ficheiro na sua lista
            for (rCnt = 1; rCnt <= range.Columns.Count; rCnt++)
            {
                for (cCnt = 1; cCnt <= range.Rows.Count; cCnt++)
                {

                    if (rCnt == 2)
                    {
                        ano.Add((range.Cells[cCnt, rCnt] as Excel.Range).Value2);
                    }
                    if (rCnt == 3)
                    {
                        ipc.Add((range.Cells[cCnt, rCnt] as Excel.Range).Value2);
                    }
                    if (rCnt == 4)
                    {
                        txI.Add((range.Cells[cCnt, rCnt] as Excel.Range).Value2);
                    }
                    if (rCnt == 5)
                    {
                        renMin.Add((range.Cells[cCnt, rCnt] as Excel.Range).Value2);
                    }
                    if (rCnt == 6)
                    {
                        renMax.Add((range.Cells[cCnt, rCnt] as Excel.Range).Value2);
                    }
                    if (rCnt == 7)
                    {
                        pib.Add((range.Cells[cCnt, rCnt] as Excel.Range).Value2);
                    }
                    if (rCnt == 8)
                    {
                        renNac.Add((range.Cells[cCnt, rCnt] as Excel.Range).Value2);
                    }
                    if (rCnt == 9)
                    {
                        renDisp.Add((range.Cells[cCnt, rCnt] as Excel.Range).Value2);
                    }
                    if (rCnt == 10)
                    {
                        renPerCap.Add((range.Cells[cCnt, rCnt] as Excel.Range).Value2);
                    }
                }
            }
            
            //calcula a evoluçao das renumeraçoes e coloca os respetivos valores na lista
           
            double a = 0;
            double b = 0;
            double c = 0;
            for (int k = 1; k < (ano.Count - 1); k++)
            {
                a = (Double)txI[k + 1];
                b = (Double)renMin[k];
                c = (Double)renMax[k];
                evoRenuMin.Add(b * ((a / 100) + 1));
                evoRenuMax.Add(c * ((a / 100) + 1));
            }
            evoRenuMin.Add(null);
            evoRenuMax.Add(null);

            xlWorkBook.Close(true, null, null);
            xlApp.Quit();

            releaseObject(xlWorkSheet);
            releaseObject(xlWorkBook);
            releaseObject(xlApp);

            // [snip] - As C# is purely object-oriented the following lines must be put into a class:

            // We use these three SQLite objects:
            SQLiteConnection sqlite_conn;
            SQLiteCommand sqlite_cmd;


            // create a new database connection:
            sqlite_conn = new SQLiteConnection("Data Source=LP1415.db;Version=3;New=True;Compress=True;");

            // open the connection:
            sqlite_conn.Open();

            // create a new SQL command:
            sqlite_cmd = sqlite_conn.CreateCommand();

            // Let the SQLiteCommand object know our SQL-Query:
            sqlite_cmd.CommandText = "CREATE TABLE dados(ano ,ipc ,taxa , renu_min ,renu_max ,pib ,rend_nacional, rend_disp , renum_capita , evol_min, evol_max)";

            // Now lets execute the SQL ;D
            sqlite_cmd.ExecuteNonQuery();


            for (int i = 1; i < ano.Count; i++)
            {

                sqlite_cmd.CommandText = "INSERT INTO dados (ano ,ipc ,taxa , renu_min ,renu_max,pib ,rend_nacional , rend_disp , renum_capita , evol_min, evol_max) VALUES ('" + ano[i] + "', '" + ipc[i] + "','" + txI[i] + "', '" + renMin[i] + "','" + renMax[i] + "', '" + pib[i] + "','" + renNac[i] + "', '" + renDisp[i] + "','" + renPerCap[i] + "','" + evoRenuMin[i] + "', '" + evoRenuMax[i] + "');";
                sqlite_cmd.ExecuteNonQuery();
            }

            // Lets insert something into our new table:
            //sqlite_cmd.CommandText = "INSERT INTO dados(ano, ipc, taxa, renu_min, renu_max, pib, rend_nacional, rend_disp, renum_capita,evol_min, evol_max) VALUES (1,2,3,4,5,6,7,8,9,10,11);";
            //sqlite_cmd.ExecuteNonQuery();

            // We are ready, now lets cleanup and close our connection:
            sqlite_conn.Close();

            MessageBox.Show("DB criada");
            botaoSeguinte.Show();
        }
        /// <summary>
        /// botao para ir manualmente selecionar o nosso ficheiro xls</summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
        
            
            // abrir o ficheiro desejado e coloca o seu caminho na caixa de texto
            OpenFileDialog openFileDialog1 = new OpenFileDialog();

            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
               
                this.pathText.Text = openFileDialog1.FileName;
            }
        }


        private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Unable to release the Object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        }


        /// <summary>
        ///botao sair do menu
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //exit
            Close();
        }
        /// <summary>
        ///botao seguinte para passar para a proxima fase do programa depois da DB criada, botao escondido
        ///so ira aparecer depois da DB criada
        ///</summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
    
        private void botaoSeguinte_Click(object sender, EventArgs e)
        {
           //passa para a form2
            mostraEstat secondForm = new mostraEstat();
            secondForm.Show();
       
        }
        /// <summary>
        ///botao about do programa</summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void verAjudaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //about
            MessageBox.Show("Trabalho LP 14/15 Realizado por Bruno Rendeiro & André Simão\n\n");
        }
        /// <summary>
        /// botao para ir manualmente selecionar o nosso ficheiro xls</summary>
        /// /// <param name="sender"></param>
        /// <param name="e"></param>
        private void openFileToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //abrir o ficheiro pelo botao do menu desejado e coloca o seu caminho na caixa de texto

            OpenFileDialog openFileDialog1 = new OpenFileDialog();

            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {

                this.pathText.Text = openFileDialog1.FileName;
            }
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {

        }
    }
}